package cn.tools.antiSamy.filter;

import org.owasp.validator.html.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;


/**
 * @author: e
 * @date: 2021/12/8
 * @description:
 */


//继承spring原有的方法，以此为标准进行编写过滤方法
public class XssRequestWrapper extends HttpServletRequestWrapper {
    public static String path = "antisamy/antisamy-ebay.xml";

    //获取出antisamy框架的拦截配置文件路径
    private static String antisamyPath = XssRequestWrapper.class.getClassLoader().getResource(path).getFile();

    public XssRequestWrapper(HttpServletRequest request) {
        super(request);
    }




    public static Policy policy = null;
    static {
        try {
            //调用其自带的静态方法Policy,通过文件路径读取出xml中配置的策略，并返回Policy对象
            policy = Policy.getInstance(antisamyPath);
        }catch (PolicyException e){
            e.printStackTrace();
        }
    }

    //调用antisamy框架的配置，过滤删除掉违法字段,这里接收客户端传来的数据，然后进行清理后，再返回回去
    public String removeXss(String text){
        AntiSamy antiSamy = new AntiSamy();
        try {
            //调用antuSamy框架方法，scan扫描，传入需要过滤的值，传入上面获取到的xml规则对象类，进行过滤
            CleanResults removeResults = antiSamy.scan(text, policy);
            //调用cleanHTML获取出过滤好的参数赋值给text
            text = removeResults.getCleanHTML();
        } catch (ScanException e) {
            e.printStackTrace();
        } catch (PolicyException e) {
            e.printStackTrace();
        }
        return text;
    }


    /**
     * @author: keno
     * @date:   2021/12/8
     * @description:
     * 重写其自带的方法，这里请求每次都会从这里过来，name为客户端传来的key值，
     * 如前端传递参数id=1,name=2,这里请求发送过来，这里的name就=id,然后处理完成以后进行
     * 第二次，第二次就传递的name过来，可以打个断点看一下
     * 这里返回的是string数组，是因为程序设计中，默认你发过来的数据都有可能是多个，所以以数组形式来接收
     * 如：http://ip/test?id=1&id=2&id=3，其实这些都能接收到，本身程序就是这样设计的
     *
     */
    @Override
    public String[] getParameterValues(String name) {
        //获取出前端传来的字段
        String[] parameterValues = super.getParameterValues(name);
        //如果传来是空直接return
        if(parameterValues == null){
            return null;
        }

        //创建一个新数组用于接收清洗好的数据
        String[] newList = new String[parameterValues.length];

        for (int i=0;i<parameterValues.length;i++){
            //将里面的数据放入removeXss中清洗，然后返回给新数组
            newList[i] = removeXss(parameterValues[i]);
        }

        return newList;
    }
}
